package fiuba.td.fabrica.model.entities;

import org.junit.Test;

import fiuba.td.fabrica.model.entities.Maquina;
import fiuba.td.fabrica.model.exceptions.TipoMaquinaInvalidoException;
import fiuba.td.fabrica.model.factories.MaquinaFactory;

/**
 * Testing sobre la clase MaquinaCalidad 
 */
public class MaquinaCalidadTest extends MaquinaTestAbstract {

	/**
	 *`El producto no debe ser defectuoso por calidad 
	 */
	@Test
	public void testOperarProductoNoDefectuosoPorCalidad() {
		this.operar();
		assertTrue(this.getProducto().isDefectuosoPorCalidad() == false);
	}
	
	/**
	 * El producto debe ser defectuoso por calidad
	 */
	@Test
	public void testOperarProductoDefectuosoPorCalidad() {
		this.getProducto().setCalidad(80);
		this.operar();
		assertTrue(this.getProducto().isDefectuosoPorCalidad() == true);
	}
	
	/**
	 * Los primeros 5 debe detectarlos y marcarlos como defectuosos por calidad, los 5 ultimos no los debe verificar
	 * y dejarlos como defectuosoPorCalidad = false. Esto es porque la maquina funciona al 50% -> de cada 10, verifica 5
	 */
	@Test
	public void testOperarProductosDefectuososCalidad() {
		this.getMaquina().setEfectividad(50);
		this.getProducto().setCalidad(80);
		for (int i = 0; i < 10; i++){
			this.operar();
			
			if (i < this.getMaquina().getEfectividad() / 10){ 
				assertTrue(this.getProducto().isDefectuosoPorCalidad() == true);
			}
			else{
				assertTrue(this.getProducto().isDefectuosoPorCalidad() == false);
			}
		}
	}
	
	/**
	 * La maquina esta averiada y no puede operar. Debe lanzar una exception
	 */
	@Test
	public void testOperarMaquinaAveriada() {
		this.getMaquina().setEfectividad(0);
		this.operar();
		assertTrue(this.getMaquina().isAveriada());
	}

	
	public Maquina getMaquinaTest() {
		try {
			return MaquinaFactory.getInstance().createMaquinaReal("CALIDAD", "Calidad", 100, 1, 1);
		} catch (TipoMaquinaInvalidoException e) {
			e.printStackTrace();
			return null;
		}
	}
	
}
